Skip to content

feat(search): add Google Gemini embedding provider#27974

Merged
pmbrull merged 28 commits into
mainfrom
pmbrull/gcp-embedding-client
May 10, 2026
Merged

feat(search): add Google Gemini embedding provider#27974
pmbrull merged 28 commits into
mainfrom
pmbrull/gcp-embedding-client

Conversation

@pmbrull
Copy link
Copy Markdown
Member

@pmbrull pmbrull commented May 7, 2026

image

Summary

Adds a fourth embedding provider — Google Gemini via the Generative Language API — alongside the existing openai, bedrock, and djl providers. Operators can now point natural-language / semantic search at Gemini models using a single API key from Google AI Studio (no GCP project, service account, or OAuth setup required).

  • New google block under naturalLanguageSearch in elasticSearchConfiguration.json with apiKey, embeddingModelId, embeddingDimension, endpoint, and modelId (the latter parallel to openai.modelId for future Gemini-based NLQ chat completions).
  • New GoogleEmbeddingClient mirroring OpenAIEmbeddingClient: API key in URL query string (Google API requirement), content.parts[].text request body, embedding.values response parsing, error-message extraction from Google's standard error envelope. The configured embeddingDimension is sent as outputDimensionality so the response vector size matches the OpenSearch index shape (required for gemini-embedding-001, which defaults to 3072 dims otherwise).
  • One-line wiring in SearchRepository.createEmbeddingClient switch and a google case in SystemRepository.getEmbeddingConfigurationMessage so /api/v1/system/status reports the configured Google model/endpoint.
  • Custom google.endpoint values are validated at construction to contain :embedContent — misconfigurations fail fast at startup with a clear message instead of opaque 404s at first embed call.
  • 25 unit tests using hand-rolled HttpClient stubs (no Mockito) — covering construction, validation, success path, HTTP errors, malformed responses, request-shape verification (URL, headers, body, outputDimensionality), URL encoding, and custom-endpoint paths.

Defaults to gemini-embedding-001 / 768 dim. text-embedding-004 is also supported via configuration. The dimension setting is honored end-to-end via outputDimensionality.

Test plan

  • mvn test -pl openmetadata-service -Dtest=GoogleEmbeddingClientTest — 25 tests pass
  • mvn test -pl openmetadata-service -Dtest='*EmbeddingClientTest' — sibling OpenAIEmbeddingClientTest / EmbeddingClientTest pass, no regressions
  • mvn spotless:apply -pl openmetadata-service — clean
  • /api/v1/system/status returns Google config diagnostic instead of "Unknown provider 'google'"
  • Smoke test against a real Google AI Studio API key (semantic search via MCP semantic_search tool)

Out of scope

  • Vertex AI / service-account auth (future googleVertexAi provider)
  • Wiring the new modelId field into an NLQ chat path — schema field is added; client implementation is a separate PR
  • True batch endpoint (:batchEmbedContents) — uses base-class default serial loop, matching siblings

Summary by Gitar

  • Refactoring:
    • Renamed maxConcurrentEmbeddingRequests to maxConcurrentRequests in both configuration schema and openmetadata.yaml to support broader request throttling.
    • Added Entity.PAGE case to deleteOrUpdateChildren in SearchRepository to enable recursive hard-deletion by FQN prefix.
  • Schema enhancements:
    • Added comprehensive configuration fields for Bedrock and OpenAI providers including timeoutSeconds, maxTokens, and temperature.
    • Introduced filterExtractor and hybridSearch configuration objects to elasticSearchConfiguration.json for fine-tuning NLQ and search pipeline parameters.
  • Google Gemini Provider:
    • Added modelId field to the google configuration block for flexible Gemini model selection.
    • Implemented URL validation to ensure google.endpoint contains the required :embedContent suffix and added diagnostic guards for system configuration.

This will update automatically on new commits.

pmbrull and others added 13 commits May 7, 2026 16:24
Adds a fourth embedding provider (google) alongside openai/bedrock/djl,
using the Generative Language API with a single API key.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
7 tasks covering schema change + regen, client implementation,
validation tests, error path tests, request shape tests, switch
wiring, and final verification.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ient

The string "models/" appeared in both DEFAULT_BASE_URL and the buildRequestBody
method. Extract it as a named constant per project standards.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ound

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…shape

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…t comment

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 7, 2026 17:34
@github-actions github-actions Bot added Ingestion safe to test Add this label to run secure Github workflows on PRs labels May 7, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new google embedding provider (Google Gemini / Generative Language API) to OpenMetadata’s vector search embedding client framework, alongside the existing bedrock, openai, and djl providers.

Changes:

  • Extended the ElasticSearch configuration schema with a new naturalLanguageSearch.google block and updated provider description text.
  • Implemented GoogleEmbeddingClient (HTTP call, request/response JSON handling, error extraction, endpoint override support).
  • Wired the new provider into SearchRepository.createEmbeddingClient and added a dedicated unit test suite.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
openmetadata-spec/src/main/resources/json/schema/configuration/elasticSearchConfiguration.json Adds google provider config block under naturalLanguageSearch and updates provider description.
openmetadata-service/src/main/java/org/openmetadata/service/search/vector/client/GoogleEmbeddingClient.java New embedding client implementation for Gemini (Generative Language API).
openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java Adds google case to embedding client provider switch.
openmetadata-service/src/test/java/org/openmetadata/service/search/vector/client/GoogleEmbeddingClientTest.java Adds unit tests for Google embedding client behavior and request construction.
docs/superpowers/specs/2026-05-07-google-gemini-embedding-client-design.md Design spec documenting the provider, config shape, and behavior.
docs/superpowers/plans/2026-05-07-google-gemini-embedding-client.md Implementation plan and step-by-step checklist for the change.

Comment on lines +139 to +147
private HttpRequest buildRequest(String body) {
String encodedKey = URLEncoder.encode(apiKey, StandardCharsets.UTF_8);
String url = endpoint + "?key=" + encodedKey;
return HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(30))
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
"default": 768
},
"endpoint": {
"description": "Custom endpoint URL. Leave empty for the default Generative Language API.",
Comment on lines +498 to +542
java.util.concurrent.atomic.AtomicReference<String> captured =
new java.util.concurrent.atomic.AtomicReference<>();
java.util.concurrent.atomic.AtomicReference<Throwable> failure =
new java.util.concurrent.atomic.AtomicReference<>();
request
.bodyPublisher()
.ifPresent(
publisher -> {
java.util.concurrent.Flow.Subscriber<java.nio.ByteBuffer> subscriber =
new java.util.concurrent.Flow.Subscriber<>() {
private final java.io.ByteArrayOutputStream out =
new java.io.ByteArrayOutputStream();

@Override
public void onSubscribe(java.util.concurrent.Flow.Subscription subscription) {
subscription.request(Long.MAX_VALUE);
}

@Override
public void onNext(java.nio.ByteBuffer item) {
byte[] arr = new byte[item.remaining()];
item.get(arr);
out.write(arr, 0, arr.length);
}

@Override
public void onError(Throwable throwable) {
failure.set(throwable);
}

@Override
public void onComplete() {
captured.set(out.toString(java.nio.charset.StandardCharsets.UTF_8));
}
};
publisher.subscribe(subscriber);
});
if (failure.get() != null) {
throw new RuntimeException("Body publisher failed", failure.get());
}
String body = captured.get();
if (body == null) {
throw new IllegalStateException("Request had no body publisher");
}
return body;
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 7, 2026

✅ TypeScript Types Auto-Updated

The generated TypeScript types have been automatically updated based on JSON schema changes in this PR.

@github-actions github-actions Bot requested a review from a team as a code owner May 7, 2026 17:40
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 7, 2026

🔴 Playwright Results — 1 failure(s), 17 flaky

✅ 4067 passed · ❌ 1 failed · 🟡 17 flaky · ⏭️ 86 skipped

Shard Passed Failed Flaky Skipped
✅ Shard 1 299 0 0 4
🔴 Shard 2 761 1 6 8
🟡 Shard 3 779 0 2 7
🟡 Shard 4 788 0 2 18
🟡 Shard 5 708 0 1 41
🟡 Shard 6 732 0 6 8

Genuine Failures (failed on all attempts)

Features/Glossary/GlossaryWorkflow.spec.ts › should display correct status badge color and icon (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator:  locator('[data-row-key*="StatusBadgeTerm1778417761882"]').locator('.status-badge')
Expected: �[32m"Draft"�[39m
Received: �[31m"In Review"�[39m
Timeout:  15000ms

Call log:
�[2m  - Expect "toHaveText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-row-key*="StatusBadgeTerm1778417761882"]').locator('.status-badge')�[22m
�[2m    18 × locator resolved to <div class="status-badge inReview" data-testid=""PW%'03f2ff4f.Livelybb639c98".StatusBadgeTerm1778417761882-status">…</div>�[22m
�[2m       - unexpected value "In Review"�[22m

🟡 17 flaky test(s) (passed on retry)
  • Features/ActivityAPI.spec.ts › Activity event shows the actor who made the change (shard 2, 1 retry)
  • Features/BulkEditEntity.spec.ts › Glossary (shard 2, 1 retry)
  • Features/DataQuality/TestLibrary.spec.ts › should maintain page on edit and reset to first page on delete (shard 2, 1 retry)
  • Features/KnowledgeCenter.spec.ts › Article mentions in description should working for Knowledge Center (shard 2, 1 retry)
  • Features/KnowledgeCenterTextEditor.spec.ts › Rich Text Editor - Text Formatting (shard 2, 1 retry)
  • Features/KnowledgeCenterTextEditor.spec.ts › Rich Text Editor - Text Formatting (shard 2, 1 retry)
  • Features/RTL.spec.ts › Verify Following widget functionality (shard 3, 1 retry)
  • Flow/AddRoleAndAssignToUser.spec.ts › Verify assigned role to new user (shard 3, 1 retry)
  • Pages/CustomProperties.spec.ts › Set & Update all CP types on glossaryTerm (shard 4, 1 retry)
  • Pages/DataContractInheritance.spec.ts › Edit Inherited Contract - Creates new asset contract instead of modifying parent (shard 4, 1 retry)
  • Pages/Entity.spec.ts › Inactive Announcement create & delete (shard 5, 1 retry)
  • Pages/ExplorePageRightPanel.spec.ts › Should allow Data Consumer to edit tier for databaseSchema (shard 6, 1 retry)
  • Pages/InputOutputPorts.spec.ts › Lineage section collapse/expand (shard 6, 1 retry)
  • Pages/Lineage/LineageFilters.spec.ts › Verify Impact Analysis service filter selection (shard 6, 1 retry)
  • Pages/Lineage/LineageRightPanel.spec.ts › Verify custom properties tab is NOT visible for messagingService in platform lineage (shard 6, 1 retry)
  • Pages/Lineage/PlatformLineage.spec.ts › Verify domain platform view (shard 6, 1 retry)
  • Pages/ODCSImportExport.spec.ts › Multi-object ODCS contract - object selector shows all schema objects (shard 6, 1 retry)

📦 Download artifacts

How to debug locally
# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip    # view trace

harshach
harshach previously approved these changes May 8, 2026
These were workflow scaffolding (design spec + implementation plan)
generated by the superpowers brainstorming/planning flow; they belong
in the local development trail, not the PR.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 8, 2026 05:50
- GoogleEmbeddingClient.buildRequest: handle endpoint with existing query
  string by switching the key separator from '?' to '&' as needed; document
  why the API key travels in the URL (Google Generative Language API
  requirement, not Bearer-header).
- GoogleEmbeddingClient.extractErrorMessage: replace empty catch block with
  a trace-level log to comply with the 'no empty catch' standard.
- elasticSearchConfiguration.json: clarify google.endpoint description so
  operators know it must be the full ':embedContent' URL, not a base URL.
- GoogleEmbeddingClientTest.extractBody: await onComplete via
  CompletableFuture.get(5s) instead of relying on synchronous publisher
  delivery; surface onError properly.
- New test: testEndpointWithExistingQueryStringUsesAmpersand verifies the
  '?' / '&' separator logic.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 8, 2026 09:13
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 8, 2026

✅ TypeScript Types Auto-Updated

The generated TypeScript types have been automatically updated based on JSON schema changes in this PR.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

…-client

# Conflicts:
#	conf/openmetadata.yaml
#	openmetadata-ui/src/main/resources/ui/src/generated/configuration/elasticSearchConfiguration.ts
#	openmetadata-ui/src/main/resources/ui/src/generated/settings/settings.ts
Copilot AI review requested due to automatic review settings May 10, 2026 09:13
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Comment on lines +360 to +364
"embeddingModelId": {
"description": "Gemini embedding model identifier (e.g., gemini-embedding-001, text-embedding-004).",
"type": "string",
"default": "gemini-embedding-001"
},
Comment thread conf/openmetadata.yaml
Comment on lines +518 to +521
google:
apiKey: ${GOOGLE_API_KEY:-""} # API key from Google AI Studio
embeddingModelId: ${GOOGLE_EMBEDDING_MODEL_ID:-"gemini-embedding-001"}
embeddingDimension: ${GOOGLE_EMBEDDING_DIMENSION:-768} # Sent as outputDimensionality. gemini-embedding-001 supports 768/1536/3072; text-embedding-004 supports 768.
@github-actions
Copy link
Copy Markdown
Contributor

✅ TypeScript Types Auto-Updated

The generated TypeScript types have been automatically updated based on JSON schema changes in this PR.

@gitar-bot
Copy link
Copy Markdown

gitar-bot Bot commented May 10, 2026

Code Review ✅ Approved 3 resolved / 3 findings

Integrates Google Gemini as an embedding provider with support for flexible model selection and comprehensive input validation. Issues regarding empty error handling and null pointer risks in the repository configuration have been resolved.

✅ 3 resolved
Quality: Empty catch block in extractErrorMessage violates guidelines

📄 openmetadata-service/src/main/java/org/openmetadata/service/search/vector/client/GoogleEmbeddingClient.java:188
The custom instructions state 'No empty catch blocks. Log exceptions with context.' The catch (Exception ignored) {} at line 188 silently swallows parse failures. While this matches the sibling OpenAIEmbeddingClient pattern and the fallback behavior (returning raw body) is correct, adding a trace-level log would aid debugging when error responses have unexpected formats.

Edge Case: NPE if google config is null in SystemRepository switch

📄 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SystemRepository.java:769-778
The new "google" case at line 769 calls nlpConfig.getGoogle() three times without a null guard. If the provider string is set to "google" but the google block is absent or null in the YAML/JSON config, this will throw a NullPointerException — caught by the generic catch (Exception e) but returning a misleading "Error getting embedding configuration" instead of a clear diagnostic.

The GoogleEmbeddingClient constructor already validates this gracefully with IllegalArgumentException("Google configuration is required"), so this switch branch (which appears to be a diagnostic/info path) should mirror that pattern.

Security: API key in URL query string may leak via server access logs

📄 openmetadata-service/src/main/java/org/openmetadata/service/search/vector/client/GoogleEmbeddingClient.java:140-141
The Google Generative Language API requires the key in the query string (?key=), so this is by design and matches Google's documentation. However, it's worth noting that unlike bearer tokens in headers, query-string secrets can appear in proxy/CDN access logs, browser history (not applicable here), and HTTP Referer headers. Since this is a server-side call with no browser or Referer risk, and Google mandates this pattern for AI Studio keys, the practical risk is low. Consider adding a brief comment documenting why the key is in the URL (Google API requirement) to prevent future reviewers from 'fixing' it to a header.

Options

Display: compact → Showing less information.

Comment with these commands to change:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

@sonarqubecloud
Copy link
Copy Markdown

@sonarqubecloud
Copy link
Copy Markdown

@pmbrull pmbrull merged commit 7e0ee80 into main May 10, 2026
67 of 68 checks passed
@pmbrull pmbrull deleted the pmbrull/gcp-embedding-client branch May 10, 2026 14:37
pmbrull added a commit that referenced this pull request May 11, 2026
* Add design: Google Gemini embedding client

Adds a fourth embedding provider (google) alongside openai/bedrock/djl,
using the Generative Language API with a single API key.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Add implementation plan: Google Gemini embedding client

7 tasks covering schema change + regen, client implementation,
validation tests, error path tests, request shape tests, switch
wiring, and final verification.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* feat(spec): add google embedding provider config block

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(search): add GoogleEmbeddingClient with happy-path test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor(search): extract MODELS_PREFIX constant in GoogleEmbeddingClient

The string "models/" appeared in both DEFAULT_BASE_URL and the buildRequestBody
method. Extract it as a named constant per project standards.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(search): add constructor validation tests for GoogleEmbeddingClient

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(search): add blank model id test and clarify null-modelId workaround

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(search): add HTTP error and malformed response tests for GoogleEmbeddingClient

* test(search): tighten empty values array assertion to check message

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(search): verify Google embedding request URL, headers, and body shape

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* test(search): extract endpoint constant and harden extractBody helper

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* feat(search): wire google embedding provider into SearchRepository switch

* test(search): cover null dimension and custom endpoint, drop redundant comment

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Update generated TypeScript types

* Remove internal planning docs from PR

These were workflow scaffolding (design spec + implementation plan)
generated by the superpowers brainstorming/planning flow; they belong
in the local development trail, not the PR.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Address PR review comments

- GoogleEmbeddingClient.buildRequest: handle endpoint with existing query
  string by switching the key separator from '?' to '&' as needed; document
  why the API key travels in the URL (Google Generative Language API
  requirement, not Bearer-header).
- GoogleEmbeddingClient.extractErrorMessage: replace empty catch block with
  a trace-level log to comply with the 'no empty catch' standard.
- elasticSearchConfiguration.json: clarify google.endpoint description so
  operators know it must be the full ':embedContent' URL, not a base URL.
- GoogleEmbeddingClientTest.extractBody: await onComplete via
  CompletableFuture.get(5s) instead of relying on synchronous publisher
  delivery; surface onError properly.
- New test: testEndpointWithExistingQueryStringUsesAmpersand verifies the
  '?' / '&' separator logic.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Update generated TypeScript types

* Wire google embedding provider into openmetadata.yaml defaults

- Add `google:` block under naturalLanguageSearch with env-var fallbacks
  (GOOGLE_API_KEY, GOOGLE_EMBEDDING_MODEL_ID, GOOGLE_EMBEDDING_DIMENSION,
  GOOGLE_API_ENDPOINT).
- Update embeddingProvider option list comment to include "google".

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Use gemini-embedding-001 default and pass outputDimensionality

The previous default (text-embedding-004) is rejected on some Google
projects with `404: not found for API version v1beta, or is not
supported for embedContent`. Switch to gemini-embedding-001 — the
current GA model, available at v1beta and broadly accessible.

- GoogleEmbeddingClient.buildRequestBody: include outputDimensionality
  from the configured embeddingDimension. Required for gemini-embedding-001
  (defaults to 3072 dims otherwise) and supported as a truncation hint
  by text-embedding-004.
- elasticSearchConfiguration.json + openmetadata.yaml: change default
  embeddingModelId to gemini-embedding-001 and document the
  outputDimensionality semantics on the embeddingDimension field.
- GoogleEmbeddingClientTest.testRequestBodyShape: assert
  outputDimensionality=768 in the captured body and use
  gemini-embedding-001 as the test fixture model.
- SystemRepository.getEmbeddingConfigurationMessage: add a `google` case
  so /api/v1/system/status surfaces the configured model/endpoint
  instead of "Unknown provider 'google'".

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Update generated TypeScript types

* Guard against missing google config in SystemRepository diagnostic

If `embeddingProvider=google` but the `google` config block is absent,
calling `nlpConfig.getGoogle().getEndpoint()` would NPE and produce
a misleading "Unable to determine embedding configuration" message.
Add an explicit null check that yields a clear diagnostic instead.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Validate google.endpoint contains :embedContent at construction

A custom endpoint missing the `:embedContent` action used to silently
produce 404s at runtime. Fail fast at startup with a clear message
showing the expected URL form, so misconfiguration surfaces in logs
instead of in vector-search failures.

- Update testCustomEndpointConstruction to use a valid full URL.
- Add testCustomEndpointWithoutEmbedContentThrows.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* feat(spec): add modelId chat field to google block

Adds a `modelId` property to the natural-language-search `google` block,
parallel to how the `openai` block exposes both `modelId` (chat) and
`embeddingModelId` (embedding). This enables Gemini-based NLQ filter
extraction (chat completions via :generateContent) on top of the existing
embedding support.

Default: gemini-2.5-flash.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Update generated TypeScript types

* Update generated TypeScript types

* trigger

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Ingestion safe to test Add this label to run secure Github workflows on PRs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants